home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / kcl.lha / c / unixsave.c < prev    next >
C/C++ Source or Header  |  1987-06-04  |  7KB  |  358 lines

  1. /*
  2. (c) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
  3. Copying of this file is authorized to users who have executed the true and
  4. proper "License Agreement for Kyoto Common LISP" with SIGLISP.
  5. */
  6.  
  7. /*
  8.     unixsave.c
  9. */
  10.  
  11. #include "include.h"
  12.  
  13. /* When MACHINE is S3000, use fcntl.h */
  14. #ifdef S3000
  15. #include <fcntl.h>
  16. #else
  17. #include <sys/file.h>
  18. #endif
  19.  
  20.  
  21. #ifdef BSD
  22. #include <a.out.h>
  23. #endif
  24.  
  25. #ifdef VAX
  26. #define    PAGSIZ        1024
  27. #define    SEGSIZ        1024
  28. #define    TXTRELOC    0
  29. #endif
  30.  
  31. #ifdef ISI
  32.  
  33.  
  34.  
  35. #endif
  36.  
  37. #ifdef SEQ
  38.  
  39.  
  40. #endif
  41.  
  42. #ifdef NEWS
  43. #define    TXTRELOC    0
  44. #endif
  45.  
  46. #ifdef IBMRT
  47.  
  48.  
  49.  
  50. #endif
  51.  
  52. #ifdef ATT
  53. #include <filehdr.h>
  54. #include <aouthdr.h>
  55. #include <scnhdr.h>
  56. #define exec        aouthdr
  57. #define a_text        tsize
  58. #define a_data        dsize
  59. #define a_bss        bsize
  60. #endif
  61.  
  62. #ifdef E15
  63. #include <a.out.h>
  64. extern    etext;
  65. #define exec        bhdr
  66. #define a_text        tsize
  67. #define a_data        dsize
  68. #define a_bss        bsize
  69. #define a_syms        ssize
  70. #define a_trsize    rtsize
  71. #define a_drsize    rdsize
  72. #define    SEGSIZ        (128*1024)
  73. #define    TXTRELOC    (1024*1024)
  74. #endif
  75.  
  76.  
  77. filecpy(to, from, n)
  78. FILE *to, *from;
  79. register int n;
  80. {
  81.     char buffer[BUFSIZ];
  82.  
  83.     for (;;)
  84.         if (n > BUFSIZ) {
  85.             fread(buffer, BUFSIZ, 1, from);
  86.             fwrite(buffer, BUFSIZ, 1, to);
  87.             n -= BUFSIZ;
  88.         } else if (n > 0) {
  89.             fread(buffer, 1, n, from);
  90.             fwrite(buffer, 1, n, to);
  91.             break;
  92.         } else
  93.             break;
  94. }
  95.  
  96.  
  97. memory_save(original_file, save_file)
  98. char *original_file, *save_file;
  99. {
  100.  
  101. #ifdef BSD
  102.     struct exec header;
  103.     int stsize;
  104. #endif
  105. #ifdef ATT
  106.     struct filehdr fileheader;
  107.     struct exec header;
  108.     struct scnhdr sectionheader;
  109.     int diff;
  110. #endif
  111. #ifdef E15
  112.     struct exec header;
  113. #endif
  114.  
  115.     char *data_begin, *data_end;
  116.     int original_data;
  117.     FILE *original, *save;
  118.     register int n;
  119.     register char *p;
  120.     extern char *sbrk();
  121.     extern char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];
  122.  
  123.     fclose(stdin);
  124.     original = fopen(original_file, "r");
  125.     if (stdin != original || original->_file != 0) {
  126.         fprintf(stderr, "Can't open the original file.\n");
  127.         exit(1);
  128.     }
  129.     setbuf(original, stdin_buf);
  130.     fclose(stdout);
  131.     unlink(save_file);
  132.     n = open(save_file, O_CREAT|O_WRONLY, 0777);
  133.     if (n != 1 || (save = fdopen(n, "w")) != stdout) {
  134.         fprintf(stderr, "Can't open the save file.\n");
  135.         exit(1);
  136.     }
  137.     setbuf(save, stdout_buf);
  138.  
  139. #ifdef BSD
  140.     fread(&header, sizeof(header), 1, original);
  141.  
  142. #ifdef VAX
  143.     data_begin
  144.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  145. #endif
  146. #ifdef SUN
  147.     data_begin
  148.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  149. #endif
  150. #ifdef SUN2R3
  151.     data_begin = (char *)N_DATADDR(header);
  152. #endif
  153. #ifdef SUN3
  154.     data_begin = (char *)N_DATADDR(header);
  155. #endif
  156. #ifdef NEWS
  157.     data_begin
  158.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  159. #endif
  160. #ifdef ISI
  161.  
  162.  
  163. #endif
  164. #ifdef SEQ
  165.  
  166.  
  167. #endif
  168. #ifdef IBMRT
  169.  
  170.  
  171. #endif
  172.  
  173.     data_end = core_end;
  174.     original_data = header.a_data;
  175.     header.a_data = data_end - data_begin;
  176.     header.a_bss = 0;
  177.     fwrite(&header, sizeof(header), 1, save);
  178.  
  179. #ifdef VAX
  180.     if (header.a_magic == ZMAGIC)
  181.         filecpy(save, original, PAGSIZ - sizeof(header));
  182.     filecpy(save, original, header.a_text);
  183. #endif
  184. #ifdef SUN
  185.     if (header.a_magic == ZMAGIC)
  186.         filecpy(save, original, PAGSIZ - sizeof(header));
  187.     filecpy(save, original, header.a_text);
  188. #endif
  189. #ifdef SUN2R3
  190.     filecpy(save, original, header.a_text - sizeof(header));
  191. #endif
  192. #ifdef SUN3
  193.     filecpy(save, original, header.a_text - sizeof(header));
  194. #endif
  195. #ifdef NEWS
  196.     if (header.a_magic == ZMAGIC)
  197.         filecpy(save, original, PAGSIZ - sizeof(header));
  198.     filecpy(save, original, header.a_text);
  199. #endif
  200. #ifdef ISI
  201.  
  202.  
  203.  
  204.  
  205. #endif
  206. #ifdef SEQ
  207.  
  208.  
  209. #endif
  210. #ifdef IBMRT
  211.  
  212.  
  213.  
  214. #endif
  215. #endif
  216.  
  217. #ifdef ATT
  218.     fread(&fileheader, sizeof(fileheader), 1, original);
  219.     fread(&header, sizeof(header), 1, original);
  220.     data_begin = (char *)header.data_start;
  221.     data_end = core_end;
  222.     original_data = header.a_data;
  223.     header.a_data = data_end - data_begin;
  224.     diff = header.a_data - original_data;
  225.     header.a_bss = sbrk(0) - core_end;
  226.     fileheader.f_symptr += diff;
  227.     fwrite(&fileheader, sizeof(fileheader), 1, save);
  228.     fwrite(&header, sizeof(header), 1, save);
  229.     fread(§ionheader, sizeof(sectionheader), 1, original);
  230.     if (sectionheader.s_lnnoptr)
  231.         sectionheader.s_lnnoptr += diff;
  232.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  233.     fread(§ionheader, sizeof(sectionheader), 1, original);
  234.     sectionheader.s_size += diff;
  235.     if (sectionheader.s_lnnoptr)
  236.         sectionheader.s_lnnoptr += diff;
  237.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  238.     fread(§ionheader, sizeof(sectionheader), 1, original);
  239.     sectionheader.s_paddr += diff;
  240.     sectionheader.s_vaddr += diff;
  241.     sectionheader.s_size = header.a_bss;
  242. #ifdef S3000
  243.         if (sectionheader.s_scnptr)
  244.                 sectionheader.s_scnptr += diff;
  245. #endif
  246.     if (sectionheader.s_lnnoptr)
  247.         sectionheader.s_lnnoptr += diff;
  248.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  249.     for (n = 4;  n <= fileheader.f_nscns;  n++) {
  250.         fread(§ionheader, sizeof(sectionheader), 1, original);
  251.         if (sectionheader.s_scnptr)
  252.             sectionheader.s_scnptr += diff;
  253.         if (sectionheader.s_lnnoptr)
  254.             sectionheader.s_lnnoptr += diff;
  255.         fwrite(§ionheader, sizeof(sectionheader), 1, save);
  256.     }
  257.     filecpy(save, original, header.a_text);
  258. #endif
  259.  
  260. #ifdef E15
  261.     fread(&header, sizeof(header), 1, original);
  262.     if (header.fmagic != NMAGIC)
  263.         data_begin
  264.         = (char *)(TXTRELOC+header.a_text);
  265.     else
  266.         data_begin
  267.         = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  268.     data_end = core_end;
  269.     original_data = header.a_data;
  270.     header.a_data = data_end - data_begin;
  271.     header.a_bss = sbrk(0) - core_end;
  272.     fwrite(&header, sizeof(header), 1, save);
  273.     filecpy(save, original, header.a_text);
  274. #endif
  275.  
  276.     for (n = header.a_data, p = data_begin;  ;  n -= BUFSIZ, p += BUFSIZ)
  277.         if (n > BUFSIZ)
  278.             fwrite(p, BUFSIZ, 1, save);
  279.         else if (n > 0) {
  280.             fwrite(p, 1, n, save);
  281.             break;
  282.         } else
  283.             break;
  284.  
  285.     fseek(original, original_data, 1);
  286.  
  287. #ifdef BSD
  288.     filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
  289.     fread(&stsize, sizeof(stsize), 1, original);
  290.     fwrite(&stsize, sizeof(stsize), 1, save);
  291.     filecpy(save, original, stsize - sizeof(stsize));
  292. #endif
  293.  
  294. #ifdef ATT
  295.     for (;;) {
  296.         n = getc(original);
  297.         if (feof(original))
  298.             break;
  299.         putc(n, save);
  300.     }
  301. #endif
  302.  
  303. #ifdef E15
  304.     filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
  305. #endif
  306.  
  307.     fclose(original);
  308.     fclose(save);
  309. }
  310.  
  311. Lsave()
  312. {
  313.     char filename[256];
  314.  
  315.     check_arg(1);
  316.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  317.     coerce_to_filename(vs_base[0], filename);
  318. /*
  319.     _cleanup();
  320. */
  321.     {
  322.         FILE *p;
  323.         int nfile;
  324.  
  325. #ifdef BSD
  326.         nfile = getdtablesize();
  327. #else
  328.         nfile = _NFILE;
  329. #endif
  330.         for (p = &_iob[3];  p < &_iob[nfile];  p++)
  331.             fclose(p);
  332.     }
  333.     memory_save(kcl_self, filename);
  334. /*
  335.     _exit(0);
  336. */
  337.     exit(0);
  338.     /*  no return  */
  339. }
  340.  
  341. init_unixsave()
  342. {
  343.     make_function("SAVE", Lsave);
  344. }
  345.  
  346. #ifdef ISI
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357. #endif
  358.